home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / thesource-7.lha / Source / Misc.lha / misc / bitcount.c next >
C/C++ Source or Header  |  1994-06-11  |  1KB  |  45 lines

  1. /*
  2. Newsgroups: comp.sys.amiga.programmer
  3. Path: usenet.ee.pdx.edu!cs.uoregon.edu!sgiblab!sgigate.sgi.com!olivea!charnel!rat!usc!sol.ctr.columbia.edu!news.kei.com!yeshua.marcam.com!zip.eecs.umich.edu!umn.edu!kksys.com!haapi!bee!sar
  4. From: sar@bee.beehive.mn.org (Steven A. Reisman)
  5. Subject: Re: counting 1 bits
  6. References: <1993Dec13.142639.12004@cs.kuleuven.ac.be>
  7. Organization: Steven Reisman & Associates
  8. Date: Tue, 14 Dec 1993 04:29:00 GMT
  9. X-Newsreader: TIN [version 1.1 PL8]
  10. Message-ID: <1993Dec14.042900.10161@bee.beehive.mn.org>
  11. Lines: 29
  12.  
  13. Stefaan Decorte (stefaan@cs.kuleuven.ac.be) wrote:
  14.  
  15. : Does there exist an (efficient) instruction to count the number of 1 bits in a 
  16. : unsigned long data type?  (preferably in C but assembler is also ok).
  17. : Or does there exist a way around performing the inefficient 32-part loop?
  18.  
  19. Try the following:
  20. */
  21.  
  22. #include <stdio.h>
  23.  
  24. int    cardcount(unsigned long x)
  25. {
  26.     x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
  27.     x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
  28.     x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
  29.     return x % 255;
  30. }
  31.  
  32. main ()
  33. {
  34.   printf("%d\n", cardcount(0xFFFFFFFF));
  35.   printf("%d\n", cardcount(0x12345678));
  36.   printf("%d\n", cardcount(0x12481248));
  37. }
  38.  
  39. /*
  40. -- 
  41. Steven A. Reisman
  42. 12695 4th St. S.                                  sar@beehive.mn.org      
  43. Afton, MN  55001                                      (612) 436-7125
  44. */
  45.